昨天使用了 Dcard 的 API 來爬取 Dcard 上面的文章。
各位開始在撰寫爬蟲後,常常會遇到一些網站刻意的擋掉爬蟲,這種擋掉爬蟲的設計稱為反爬蟲技術。
最常見的反爬蟲技術莫過於驗證碼了。我反爬蟲會分兩篇來討論,今天這篇會專注於驗證碼的部分。
驗證碼英文稱為 Captcha,是一種區分用戶是機器或人類的公共全自動程序。
常見的有
以及 Google 發行的 reCAPTCHA
可能有些讀者會發現 Google 發行的 reCAPTCHA 有時候會需要二次驗證,有時候不用。事實上,如果演算法檢測到當前系統存在風險,比如可能是陌生的網路環境,可能是模擬程式,就會須要二次驗證。
要應對驗證碼有幾個方法,以下列出。
人工輸入驗證碼
模擬人類動作(reCAPTCHA )
OCR 辨識驗證碼
第三方平台驗證碼辨識服務
User Session
人工輸入驗證碼
此應對方法十分直觀,就是當遇到需要驗證碼的地方時,就用類似 input() 的步驟將其停住,把圖片載下來,人工輸入驗證碼,之後繼續爬取。
這個應對方法常用於 Selenium 爬取時遇到 reCAPTCHA ,往往會需要這種會渲染網頁 JavaScript 或在網頁停留、捲動一段時間,而後點擊 I'm not a robot 。
此應對方法主要是將驗證碼的圖片使用 OCR 文字辨識。
Python 常用的 OCR 為 pytesseract。
pipenv install pillow
pipenv install pytesseract
pytesseract 需要下載Tesseract執行檔,各位要記得安裝路徑,等等在 Python 程式中需要指定該路徑。
載點 : https://github.com/UB-Mannheim/tesseract/wiki
from PIL import Image
import pytesseract
if __name__ == '__main__':
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
img = Image.open('img.png')
text = pytesseract.image_to_string(img)
print(text)
有許多提供這類服務的平台,這邊推薦 Anti-captcha,以量計費,如果需求不多,可以使用很久。
先使用瀏覽器先行登入,之後將 Session 匯出,使爬蟲帶上該 Session , 便可以達到不使用帳號密碼登入的效果,自然就不需要面對驗證碼。
本次鐵人賽有兩篇文章用到此技巧。
【Day 11】- 還在 PTT 點擊已滿 18 歲? 帶上 cookies 吧!(實戰 PTT 爬蟲 1/3)
【Day 21】- 你的爬蟲還在用帳號密碼進行登入? 帶上 Session 吧!(實戰 Selenium 自動點擊 Instagram 好友貼文贊 1/2)
本次列舉了驗證碼這個反爬蟲技術的應對方法,善用這些方法,可以去迴避掉一些網頁的反爬蟲,如果遇到了還是無法用以上方法應對的狀況,可以考慮換個爬蟲架構,或繼續深入優化 OCR 或者一些資安方面繞過手法。
明天會帶各位看一下常見的反爬蟲技術。
Python 進階爬蟲技巧- Selenium + Anti-captcha 圖片驗證碼破解 : https://medium.com/@keigi1203/python-進階爬蟲技巧-selenium-anti-captcha-圖片驗證碼破解-b9486df79aa7